SMPTE

part of wslib

The SMPTE object holds timecode values and provides noumerous ways for handling timecode.

The object shows in the post window as an array with hours, minutes, seconds, frames and subFrames.

All values are rounded to whole numbers except the subframes.

Used by SMPTEView, TransportWindow and SimpleMIDIFile

By default the frameRate is 25 (25 per second), and the subFrameRate 100 (100 per frame).

please note: the SMPTE class does not generate nor recognise SMPTE timecode signals.

Creation

SMPTE( inSeconds, fps )

Generates a new SMPTE object

inSeconds - raw seconds from which SMPTE will calculate hours, minutes, seconds, frames and subframes.

fps - frame rate (defaults to 25, standard for europe). Dropped frames are not supported, but the frame rate doesn't have to be a whole number.

SMPTE( 5 ); // -> SMPTE[ 0, 0, 5, 0, 0 ]

SMPTE( 65.5); // -> SMPTE[ 0, 1, 5, 12, 50 ] (1 minute, 5 seconds, 12 frames, 50 subFrames (1/100))

SMPTE[ hours, minutes, seconds, frames, subFrames ]

Creates a SMPTE object directly. This only works when all five values are entered.

SMPTE[ 0, 10, 30, 5, 0 ]; // -> SMPTE[ 0, 10, 30, 5, 0 ]

SMPTE[ 0, 10, 70, 5, 0 ]; // -> SMPTE[ 0, 10, 70, 5, 0 ] (does not recalculate)

SMPTE[ 0, 10, 70, 5, 0 ].reCalculate; // -> SMPTE[ 0, 11, 10, 5, 0 ]

SMPTE.hours( inHours, fps ), SMPTE.minutes( inMinutes, fps ),

SMPTE.frames( inFrames, fps ), SMPTE.subFrames( inSubFrames, fps )

Generates a new SMPTE object with raw values as input

SMPTE.hours( 1.25 ); // -> SMPTE[ 1, 15, 0, 0, 0 ] (1 hour, 15 minutes)

SMPTE.type( input, type, fps )

Generates a new SMPTE object with raw values with specified types as input

type - a Symbol, can be:

\hours, \minutes, \seconds, \frames, \subFrames

SMPTE.type( 1.25, \hours ); // -> SMPTE[ 1, 15, 0, 0, 0 ] (1 hour, 15 minutes)

SMPTE.minSec( minutes, seconds )

Generates a new SMPTE object with raw minutes and seconds as input

SMPTE.minSec( 10, 5 ); // -> SMPTE[ 0, 10, 5, 0, 0 ]

SMPTE.minSec( 70, 80.5 ); // -> SMPTE[ 1, 11, 20, 12, 50 ]

SMPTE.fromString( string, fps )

string - a string with ":" characters as dividers for hours, minutes, seconds and frames

SMPTE.fromString( "00:10:05:00" ); // -> SMPTE[ 0, 10, 5, 0, 0 ]

SMPTE.localtime

Creates a new SMPTE object with the current system time

Methods:

asSeconds

returns the raw seconds

SMPTE( 65.5).asSeconds; // -> 65.5

asHours, asMinutes, asFrames, asSubframes

returns raw values for hours, minutes, frames or subFrames

SMPTE( 65.5).asMinutes; // -> 1.0916666666667

SMPTE( 65.5).asSubFrames; // -> 163750

hours, minutes, seconds, frames, subFrames

acces values directly

SMPTE( 65.5).minutes; // -> 1

SMPTE( 65.5).seconds; // -> 5

hours_ , minutes_ , seconds_ , frames_ , subFrames_

set values directly. Does recaclulate internally.

SMPTE( 0 ).minutes_( 5.5 ); // -> SMPTE[ 0, 5, 30, 0, 0 ]

fps_( newFps )

set framerate and recalculate

SMPTE( 65.5).frames; // -> 12

SMPTE( 65.5).fps_(30).frames; // -> 15

setFps( newFps )

set framerate without recalculation

SMPTE( 65.5).setFps(30).frames; // -> 12

toString

returns a time string separated by ":" characters. Subframes are ignored

SMPTE( 65.5 ).toString; // -> 00:01:05:12

SMPTE( 65.5, fps: 1000).toString; // -> 00:01:05:500

reCalculate

recalculates any invalid time values to valid time values. This is called internally in most methods.

asMinSec

returns an array with raw minutes and seconds (as used by the *minSec creation method)

SMPTE.minSec(10, 21.1).asMinSec; // -> [10, 21.1]

Operators:

+, -, *, /

SMPTE objects can be added, substracted, multiplied and divided with other SMPTE objects, Numbers or Arrays. For numbers the type can be specified with an adverb (.hours, .minutes, .seconds, .frames, .subFrames).

The framerate (fps) of the first object will be used for the output object.

SMPTE( 20 ) + SMPTE( 50 ); // -> SMPTE[ 0, 1, 10, 0, 0 ]

SMPTE( 20 ) + 50; // -> SMPTE[ 0, 1, 10, 0, 0 ]

SMPTE( 20 ) +.minutes 2.5; // -> SMPTE[ 0, 2, 50, 0, 0 ] (plus 2 minutes and 30 seconds)

SMPTE[ 0, 10, 5, 0, 0 ] + [0, 1, 2, 3 ]; // -> SMPTE[ 0, 11, 7, 3, 0 ]

SMPTE( 0.1 ) + SMPTE.frames( 3, fps: 30 ); // -> SMPTE[ 0, 0, 0, 5, 0 ] (fps = 25)

SMPTE( 20 ) * 2; // -> SMPTE[ 0, 0, 40, 0, 0 ]

( SMPTE.minSec( 4, 33 ) + SMPTE.minSec( 10, 55 ) ).asMinSec; // -> [ 15, 28 ] (here you go Sciss!)

<, <=, ==, =>, >, !=

Binary operators

SMPTE( 10 ) > SMPTE( 5 ); // -> true

SMPTE.hours( 1.1 ) == SMPTE.frames( 99000 ); // -> true